﻿using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using ExceptionReporting;
using SmartHealthCareDbLayer;

namespace SmartHealthCare.Frm
{
    public partial class FrmServiciosMedicosPorMedicos : Form
    {
        public FrmServiciosMedicosPorMedicos()
        {
            InitializeComponent();
        }

        private void FrmServiciosMedicosPorMedicos_Load(object sender, EventArgs e)
        {
            LoadData();
        }

        private void LoadData()
        {
            _cbMedico.DataSource = ModelSingle.Instance.Medicos.ToList();
            _cbMedico.ValueMember = "IdMedico";
            _cbMedico.DisplayMember = "Nombre";

            foreach (var item in ModelSingle.Instance.ServiciosMedicos)
            {
                _listDisponibles.Items.Add(new ListViewItem(item.Descripcion) { Tag = item });
            }
            //
        }

        private void CbMedicoSelectedIndexChanged(object sender, EventArgs e)
        {
            var medico = ((ComboBox)sender).SelectedItem as Medicos;
            if (medico == null) return;
            //
            var temp = (from s in ModelSingle.Instance.ServiciosMedicosPorMedicos
                        where s.IdMedico == medico.IdMedico
                        select s.ServiciosMedicos
                           ).ToList();
            _list.Items.Clear();
            foreach (var item in temp)
            {
                _list.Items.Add(new ListViewItem(item.Descripcion) { Tag = item });
            }

        }

        private void ListDisponiblesItemDrag(object sender, ItemDragEventArgs e)
        {
            _listDisponibles.DoDragDrop(_listDisponibles.SelectedItems, DragDropEffects.Copy);
        }

        private void ListDragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void ListDragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(ListViewItem)))
            {
                var data = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
                AddServicio((ServiciosMedicos)data.Tag);

            }
            if (e.Data.GetDataPresent(typeof(ListView.SelectedListViewItemCollection)))
            {
                var data = (ListView.SelectedListViewItemCollection)e.Data.GetData(typeof(ListView.SelectedListViewItemCollection));
                foreach (ListViewItem d in data)
                {
                    AddServicio((ServiciosMedicos)d.Tag);
                }

            }

        }

        private void AddServicio(ServiciosMedicos tag)
        {
            var medico = _cbMedico.SelectedItem as Medicos;
            if (medico == null) return;
            int? id = ModelSingle.Instance.ServiciosMedicosPorMedicos.Max(s => s.IdMedico);
            var temp = ServiciosMedicosPorMedicos.CreateServiciosMedicosPorMedicos(id.HasValue ? id.Value + 1 : 1);
            temp.IdMedico = medico.IdMedico;
            temp.IdServicioMedico = tag.IdServicioMedico;
            try
            {
                switch (temp.EntityState)
                {
                    case EntityState.Added: //si el registro es nuevo;
                    case EntityState.Detached:
                        ModelSingle.Instance.AddToServiciosMedicosPorMedicos(temp); //agrego a la coleccion
                        ModelSingle.Instance.SaveChanges(); //guardo los cambios.
                        break;
                    case EntityState.Modified:
                        ModelSingle.Instance.SaveChanges(); //como es una modificacion, guardo los cambios.
                        break;
                    default:
                        ModelSingle.Instance.SaveChanges(); //como creo que es una modificacion , guardo los cambios.
                        break;
                }
                _list.Items.Add(new ListViewItem(tag.Descripcion) { Tag = tag });
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }

        }

        private void ListItemDrag(object sender, ItemDragEventArgs e)
        {

            var medico = _cbMedico.SelectedItem as Medicos;
            if (medico == null) return;
            _list.DoDragDrop(e, DragDropEffects.Copy);


            try
            {
                foreach (ListViewItem item in _list.SelectedItems)
                {
                    var current = item.Tag as ServiciosMedicos;

                    var s =
                        ModelSingle.Instance.ServiciosMedicosPorMedicos.Where(
                            sm => sm.IdMedico == medico.IdMedico && sm.IdServicioMedico == current.IdServicioMedico).
                            First();
                    //

                    medico.ServiciosMedicosPorMedicos.Remove(s);
                    ModelSingle.Instance.SaveChanges();
                    //
                    CbMedicoSelectedIndexChanged(_cbMedico, new EventArgs());

                }
            }
            catch (Exception ex)
            {
                var reporter = new ExceptionReporter();
                reporter.ReadConfig();
                reporter.Show(ex);
            }
        }
    }
}
